iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Software Development

RISC-V 與處理器之架構學習及應用系列 第 26

[Day26] CALL: Assembler (2/5)

  • 分享至 

  • xImage
  •  
  1. 組合語言轉換為機器語言的過程

    • 輸入:組合語言程式碼(例如 foo.s for RISC-V),這些程式碼可能包含偽指令(pseudoinstructions)。偽指令是一種高層次指令,最終會被轉換成具體的機器指令。
    • 輸出:機器語言模組(object file,例如 foo.o for RISC-V)。這個物件文件包含機器碼,並且還包含一些連結和除錯所需的資訊,例如符號表(Symbol Table)、重定位資訊(Relocation Information)、數據段(Data Segment)等。
    • 組譯器的工作:組譯器會讀取並使用 directives(指令),將偽指令轉換為真正的組合語言指令,最終生成機器碼。組譯器會產生一個 object file,這是最終用於執行的機器碼。
  2. Directives 指令的作用

    • Directive 是一種告訴組譯器如何處理程式碼不同部分的指令。它不會生成機器指令,而是用來指示如何構建 object file。
    • 常見的 Directives 包括:
      • .text:告訴組譯器接下來的項目屬於程式的文字段(text segment),也就是放置機器碼的區域。
      • .data:用來標示接下來的項目屬於資料段(data segment),這些數據會以二進制形式存儲在 object file 中。
      • .globl sym:將符號 sym 宣告為全域變數,可以從其他文件中被引用。
      • .string str:將字串 str 存入記憶體,並在字串末尾加上空字元以便終止。
      • .word w1 ... wn:將 n 個 32 位元數量依次存入記憶體。
  3. Object File 格式
    Object file 是程式最終執行前的中間文件,包含不同的部分來支持連結和執行:

    • Object File Header:記錄其他部分(如文字段、資料段)的大小和位置。
    • Text Segment:存放程式的機器碼。
    • Data Segment:存放靜態數據的二進制表示,如變數或常數的初始化數值。
    • Symbol Table:列出文件中所有的標籤和靜態數據,這些數據可以被其他程式引用。例如,某些變數可能需要在其他模組中被訪問,或標籤可能需要在連結過程中用到。
    • Relocation Information:需要稍後由連結器修正的程式碼行,這是因為在程式組譯的時候,某些外部的符號地址還無法確定,必須在最終的連結階段進行修正。
  4. 生成機器碼的過程

    • 簡單情況:對於一些簡單的算術運算、邏輯操作、位移等,所有必要的資訊都已包含在指令內部。例如,指令 add x18, x18, x10addi x19, x19, -1,這些指令的操作數和結果都可以直接從指令本身中解讀出來。
    • PC-relative 分支和跳轉:例如,beqbnejal 等指令需要計算跳轉到標籤的位移(offset)。在這些情況下,指令中的位移是相對於當前程式計數器(PC)的。當 pseudoinstructions 被替換為實際指令後,所有基於 PC 的位址計算都能被執行。
  5. PC-Relative 地址計算的雙遍法

    • 當編譯器處理程式中的標籤時,會面臨一個「forward reference」(前向引用)問題,這是指程式中後面定義的標籤在前面的指令中被引用,這使得在單次遍歷中無法確定正確的位移。
    • 雙遍法解決這個問題:
      • 第一次遍歷:紀錄標籤的位置,將它們存放在符號表(symbol table)中。
      • 第二次遍歷:根據標籤的位置生成機器碼,計算相對位移。
  6. 處理其他引用

    • 對其他文件的引用:例如從 C 程式庫中調用 strlen 函數,這需要知道 strlen 函數的地址。
    • 對靜態數據的引用:例如指令 la 會被分解成 luiaddi,這些需要完整的 32 位地址。
    • 這些地址在組譯過程中尚未確定,因此組譯器會將這些資訊記錄在重定位資訊(Relocation Information)和符號表(Symbol Table)中,以便在連結階段進行修正。
  7. 完整的 Object File 結構

    • File Header:包含檔案的基本資訊,如大小和位置信息。
    • Text Segment:包含機器碼,這是程式的核心部分。
    • Data Segment:靜態數據的二進制表示,如全域變數、常數等。
    • Symbol Table:記錄程式中的所有標籤和靜態變數,這些變數可以被其他模組引用。
    • Relocation Information:指出需要在連結階段修正的程式碼部分。
    • Debugging Information:用來支持除錯工具,協助開發者跟蹤程式執行。

上一篇
[Day25] Translating and Running a Program: CALL (1/5)
下一篇
[Day27] CALL: Linker (3/5)
系列文
RISC-V 與處理器之架構學習及應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言